import fs from 'fs'
import path from 'path'

/**
 * 创建一个 Vite 插件，用于在开发服务器中提供依赖信息，并在构建结束时生成依赖信息文件。
 *
 * @returns {Object} 返回一个 Vite 插件对象。
 */
export default function dependenciesPlugin() {
    return {
        // 插件名称
        name: 'vite-plugin-dependencies',
        // 配置开发服务器中间件
        configureServer(server) {
            // 使用 Express 中间件处理 `/api/dependencies` 路由请求
            server.middlewares.use('/api/dependencies', (req, res) => {
                // 获取项目根目录下的 package.json 文件路径
                const packageJsonPath = path.resolve(__dirname, 'package.json')

                // 读取并解析 package.json 文件
                const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))

                // 提取 dependencies 和 devDependencies
                const { dependencies, devDependencies } = packageJson

                // 设置响应头为 JSON 格式
                res.setHeader('Content-Type', 'application/json')

                // 将依赖信息作为 JSON 响应返回
                res.end(JSON.stringify({ dependencies, devDependencies }))
            })
        },
        // 构建结束后执行的钩子
        buildEnd() {
            // 获取项目根目录下的 package.json 文件路径
            const packageJsonPath = path.resolve(__dirname, 'package.json')

            // 读取并解析 package.json 文件
            const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))

            // 提取 dependencies 和 devDependencies
            const { dependencies, devDependencies } = packageJson

            // 将依赖信息转换为格式化的 JSON 字符串
            const dependenciesJson = JSON.stringify({ dependencies, devDependencies }, null, 2)

            // 定义输出文件路径
            const outputPath = path.resolve(__dirname, 'public/dependencies.json')

            // 将依赖信息写入到 public 目录下的 dependencies.json 文件
            fs.writeFileSync(outputPath, dependenciesJson)
        }
    }
}
